package de.hm.edu.kinderfinder.communication;

import android.util.Log;
import de.hm.edu.kinderfinder.pojos.LocationObject;
import de.hm.edu.kinderfinder.pojos.ZoneObject;

/**
 * 
 * @author Valeri Palajtschenko Diese Klasse verarbeitet alle eingehenden SMSen
 *         in entsprechende Containerklassen, die für die weitere Verarbeitung
 *         verwendet benätigt werden.
 * 
 * 
 */

public class SmsParser {

	/**
	 * Diese Methode wird genutzt, wenn eine SMS vom Typ
	 * "Neue Zone mit Kartenlink" eingeht. Sie parset die notwendigen
	 * Informationen: zonename longitude latitude radius
	 * 
	 * @param sms
	 * @return daten
	 */
	public ZoneObject parsNewZone(String sms) {

		// Attribute
		String longAt = "";
		String longitude = "";
		String Latitude = "";
		String zone = "";
		String radius = "";
		ZoneObject daten = new ZoneObject();

		// Alle einzelnen W�rter in Array
		String[] allString = sms.split(" ");
		// Ermittlung der Zone
		// Je nachdem aus wievielen W�rtern die Zone besteht
		for (int i = 0; i < allString.length - 5; i++) {
			zone = zone + " " + allString[i];
		}
		// Der Teil nach dem Enter wird entfernt
		zone = zone.substring(1, (zone.length() - 4));

		// Ermittlung des Radius
		radius = allString[allString.length - 1];
		// Der am Ende angeh�ngte Gr��enname wird abgeschnitten
		radius = radius.substring(4, radius.length() - 2);

		// Ermittlung der Koordinaten / Longitude und Latitude
		// Durchlaufen der SMS
		for (int charStelle = 0; charStelle < (sms.length() - 3); charStelle++) {

			// In der SMS nach "http" suchen um die Stelle des Links zu finden
			if (sms.charAt(charStelle) == 'h'
					&& sms.charAt(charStelle + 1) == 't'
					&& sms.charAt(charStelle + 2) == 't'
					&& sms.charAt(charStelle + 3) == 'p') {

				// Die Koordinaten aus dem Link sondieren
				// Anfang der Koordinaten fix
				int charStelle3 = charStelle + 30; // Anfang der Koordinaten
				// Durchlaufen der SMS ab Link
				for (int charStelle2 = charStelle + 30; charStelle2 < sms
						.length(); charStelle2++) {
					// Ermittlung der Korrdinaten und abschneiden
					if (sms.charAt(charStelle2) != '0'
							&& sms.charAt(charStelle2) != '1'
							&& sms.charAt(charStelle2) != '2'
							&& sms.charAt(charStelle2) != '3'
							&& sms.charAt(charStelle2) != '4'
							&& sms.charAt(charStelle2) != '5'
							&& sms.charAt(charStelle2) != '6'
							&& sms.charAt(charStelle2) != '7'
							&& sms.charAt(charStelle2) != '8'
							&& sms.charAt(charStelle2) != '9'
							&& sms.charAt(charStelle2) != '.'
							&& sms.charAt(charStelle2) != ',') {
						int charStelleEnde;
						charStelleEnde = charStelle2;
						longAt = sms.substring(charStelle3, charStelleEnde);
						charStelle2 = sms.length();
					}
				}
				charStelle = sms.length() - 3;
			}
		}

		// Die Koordinaten Latitude und Longitude von einer trennen
		// an der STelle, wo das "," ist wird getrennt.
		for (int charStelle = 0; charStelle < (longAt.length()); charStelle++) {
			if (longAt.charAt(charStelle) == ',') {
				longitude = longAt.substring(0, charStelle);
				Latitude = longAt.substring(charStelle + 1, longAt.length());
			}
		}

		// setzen der Werte in Objekt
		Log.i("pk", Latitude + " : " + longitude + " " + radius + " . " + zone);
		daten.setLatitude(Float.parseFloat(Latitude));
		daten.setLongitude(Float.parseFloat(longitude));
		daten.setRadius(Integer.parseInt(radius));
		daten.setZonename(zone);
		System.out.println(daten);
		return daten;
	}

	/**
	 * Diese Methode wird genutzt, wenn eine SMS vom Typ "Zone verlassen"
	 * eingeht. Sie parset die notwendigen Informationen: zonename
	 * 
	 * @param sms
	 * @return daten
	 */
	public ZoneObject parsExitZone(String sms) {
		// Attribute
		String zone = "";
		ZoneObject daten = new ZoneObject();

		// Alle einzelnen W�rter in Array
		String[] allString = sms.split(" ");

		// Falls Zone aus mehr als einem Wort besteht
		if (allString.length > 9) {

			for (int i = 2; i < allString.length - 5; i++) {
				zone = zone + " " + allString[i];
				System.out.println(zone);
			}

			// Falls Zone Nur aus einem Wort besteht
		} else {
			zone = allString[2];
		}

		// setzen der Werte in Objekt
		daten.setZonename(zone);
		return daten;
	}

	/**
	 * Diese Methode wird genutzt, wenn eine SMS vom Typ "Zone erreicht"
	 * eingeht. Sie parset die notwendigen Informationen: longitude latitude
	 * 
	 * @param sms
	 * @return daten
	 */
	public ZoneObject parsEntryZone(String sms) {

		// Attribute
		String zone = "";
		ZoneObject daten = new ZoneObject();

		// Alle einzelnen W�rter in Array
		String[] allString = sms.split(" ");
		if (allString.length > 4) {

			// Falls Zone aus mehr als einem Wort besteht
			for (int i = 2; i < allString.length - 1; i++) {
				zone = zone + " " + allString[i];
				System.out.println(zone);
			}
		}
		// Falls Zone Nur aus einem Wort besteht
		else {
			zone = allString[2];
		}

		// setzen der Werte in Objekt
		daten.setZonename(zone);

		return daten;
	}

	// Parser Methode zum ident der Koordinaten
	public LocationObject parseNewLocationPoint(String sms) {
		// Attribute
		String Attitude = "";
		String Lattitude = "";
		String AttLatt = "";
		LocationObject Daten;

		// Schleife zum durchsuchen der Strings / Ziel: AttLatt bestimmen
		for (int charStelle = 0; charStelle < (sms.length() - 3); charStelle++) {

			// In der SMS nach "http" suchen um den Link zu finden
			if (sms.charAt(charStelle) == 'h'
					&& sms.charAt(charStelle + 1) == 't'
					&& sms.charAt(charStelle + 2) == 't'
					&& sms.charAt(charStelle + 3) == 'p') {
				// Die Koordinaten aus dem Link sondern
				int charStelle3 = charStelle + 38; // Anfang der Koordinaten
				for (int charStelle2 = charStelle + 38; charStelle2 < sms
						.length(); charStelle2++) {
					if (sms.charAt(charStelle2) != '0'
							&& sms.charAt(charStelle2) != '1'
							&& sms.charAt(charStelle2) != '2'
							&& sms.charAt(charStelle2) != '3'
							&& sms.charAt(charStelle2) != '4'
							&& sms.charAt(charStelle2) != '5'
							&& sms.charAt(charStelle2) != '6'
							&& sms.charAt(charStelle2) != '7'
							&& sms.charAt(charStelle2) != '8'
							&& sms.charAt(charStelle2) != '9'
							&& sms.charAt(charStelle2) != '.'
							&& sms.charAt(charStelle2) != ',') {
						int charStelleEnde;
						charStelleEnde = charStelle2;
						AttLatt = sms.substring(charStelle3, charStelleEnde);
						charStelle2 = sms.length();
					}
				}
				charStelle = sms.length() - 3;
			}
		}

		// Schleife zum durchsuchen von AttLatt / Ziel: Attitude und Lattitude
		// bestimmen;
		for (int charStelle = 0; charStelle < (AttLatt.length()); charStelle++) {
			if (AttLatt.charAt(charStelle) == ',') {
				Attitude = AttLatt.substring(0, charStelle);
				Lattitude = AttLatt.substring(charStelle + 1, AttLatt.length());
			}
		}
		// Koordinaten returnen
		Daten = new LocationObject(Double.parseDouble(Attitude),
				Double.parseDouble(Lattitude));
		return Daten;// AttLatt
	}

}